// *********************************************************************************
// Project Name : zkx2024
// Author       : Glqu
// Email        : QGL_MAX@163.com
// Create Time  : 2024-04-13
// File Name    : en_crc.v
// Module Name  : en_crc
// Called By    : Glqu
// Abstract     : std_en_crc
//
// 
// *********************************************************************************
// Modification History:
// Date         By              Version                 Change Description
// -----------------------------------------------------------------------
// 2024-04-13    Macro           1.0                     Original
//  
// *********************************************************************************



// *********************************************************************************
module en_crc(
    input       CLK,
    input       RST_N,
    input       I_DATA,
    output      CRC_OUT,
    output      OUT_VLD
);

//parameter
parameter       DATA_WIDTH  =  32;
parameter       CRC_WIDTH   =  4;

//IO_define
logic    [0:0]                       CLK;
logic    [0:0]                       RST_N;
logic    [DATA_WIDTH-1:0]            I_DATA;
logic    [CRC_WIDTH-1:0]             CRC_OUT;
logic    [0:0]                       OUT_VLD;

//INTER_SIGNAL_define
logic    [CRC_WIDTH-1:0]             o_crc;


assign o_crc[0] = I_DATA[30]^ I_DATA[26]^ I_DATA[25]^ I_DATA[24]^ I_DATA[23]^ I_DATA[21]^ I_DATA[19]^ I_DATA[18]^ I_DATA[15]^ I_DATA[11]^ I_DATA[10]^ I_DATA[9 ]^ I_DATA[8 ]^ I_DATA[6 ]^ I_DATA[4 ]^ I_DATA[3 ]^ I_DATA[0 ] ;
assign o_crc[1] = I_DATA[31]^ I_DATA[30]^ I_DATA[27]^ I_DATA[23]^ I_DATA[22]^ I_DATA[21]^ I_DATA[20]^ I_DATA[18]^ I_DATA[16]^ I_DATA[15]^ I_DATA[12]^ I_DATA[8 ]^ I_DATA[7 ]^ I_DATA[6 ]^ I_DATA[5 ]^ I_DATA[3 ]^ I_DATA[1 ]^ I_DATA[0 ] ;
assign o_crc[2] = I_DATA[31]^ I_DATA[28]^ I_DATA[24]^ I_DATA[23]^ I_DATA[22]^ I_DATA[21]^ I_DATA[19]^ I_DATA[17]^ I_DATA[16]^ I_DATA[13]^ I_DATA[9 ]^ I_DATA[8 ]^ I_DATA[7 ]^ I_DATA[6 ]^ I_DATA[4 ]^ I_DATA[2 ]^ I_DATA[1 ] ;
assign o_crc[3] = I_DATA[29]^ I_DATA[25]^ I_DATA[24]^ I_DATA[23]^ I_DATA[22]^ I_DATA[20]^ I_DATA[18]^ I_DATA[17]^ I_DATA[14]^ I_DATA[10]^ I_DATA[9 ]^ I_DATA[8 ]^ I_DATA[7 ]^ I_DATA[5 ]^ I_DATA[3 ]^ I_DATA[2 ] ;

always@ (posedge CLK or negedge RST_N) begin
    if(!RST_N)begin
        CRC_OUT<=4'd0;
        OUT_VLD<=1'b0;
    end
    else begin
        CRC_OUT<=o_crc;
        OUT_VLD<=1'b1;
    end
end

endmodule
